package com.example.demo.design.chainhandle;

import lombok.NoArgsConstructor;

import java.util.Objects;

public abstract class BaseResponsibilityChainHandler<E> {

    /**
     * 下一个处理器，没有则为null
     */
    private BaseResponsibilityChainHandler<E> nextHandler;

    /**
     * 设置下一个处理器
     *
     * @param handler 新的执行器
     */
    private void setNextHandler(BaseResponsibilityChainHandler<E> handler) {
        this.nextHandler = handler;
    }

    /**
     * 下一个处理器开始处理
     *
     * @param e 入参
     */
    protected void executeNextHandler(E e) {
        if (Objects.nonNull(this.nextHandler)) {
            this.nextHandler.doHandler(e);
        }
    }

    /**
     * 处理器具体实现方法
     *
     * @param e 入参
     */
    public abstract void doHandler(E e);

    /**
     * 建造者
     */
    @NoArgsConstructor
    public static class Builder<T> {

        /**
         * 头处理器
         */
        private BaseResponsibilityChainHandler<T> head;
        /**
         * 尾处理器
         */
        private BaseResponsibilityChainHandler<T> tail;

        /**
         * 构建得到最终对象
         *
         * @return
         */
        public BaseResponsibilityChainHandler<T> build() {
            //只要添加了处理器则不会执行
            if (this.head == null) {
                return new BaseResponsibilityChainHandler<T>() {
                    @Override
                    public void doHandler(T t) {
                        //默认无实现，避免不添加处理器导致NPE
                    }
                };
            }
            return this.head;
        }

        /**
         * 链中添加处理器
         *
         * @param handler 新添加的处理器
         * @return
         */
        public  Builder<T> addHandler(BaseResponsibilityChainHandler<T> handler) {
            if (head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.setNextHandler(handler);
            this.tail = handler;
            return this;
        }
    }
}
